
module LerArquivoAutomato(analisaTexto) where

import System.IO
import System

type Terminal = Char
type Alfabeto = [Terminal]
type Estado = String
type Transicao = (Estado,Terminal,Estado)
type Automato = (Estado, [Estado], [Transicao])


main :: IO()
main = do
		--args <- getArgs
		--
		arquivo <- openFile "ArquivoAutomato_Exemplo.txt" ReadMode
		texto <- hGetContents arquivo
		print texto
		print (analisaTexto texto)


analisaTexto :: String -> ( Automato, [String])
analisaTexto texto =(
					  (
					  	( pegaLinha (retirarBloco texto 3)),
					  	( pegaPalavras (retirarBloco texto 4)),
					  	( lerFuncaoDeTransicao ( lerAlfabeto (retirarBloco texto 0))  (tiraLinha (retirarBloco texto 2)) )
					   ),
					    ( pegaPalavras (retirarBloco texto 5))
					 )

lerFuncaoDeTransicao :: Alfabeto -> String -> [Transicao]
lerFuncaoDeTransicao _ [] = []
lerFuncaoDeTransicao a t = ( lerLinhaFT (pegaPalavra t) a ( tiraEspaco(tiraPalavra(pegaLinha t)) ) ) ++
							   ( lerFuncaoDeTransicao a (tiraEspaco (tiraLinha t)) )

--lerFuncaoDeTransicao "ab" "q0; q1, q0\nq1; q1, q1\n"
lerLinhaFT :: Estado -> Alfabeto -> String -> [Transicao]
lerLinhaFT _ [] _ = []
lerLinhaFT e (a : as) (l : ls)
	|otherwise = (e, a, pegaPalavra (l : ls) ):(lerLinhaFT e as (tiraEspaco (tiraPalavra (l:ls)) ) )

lerAlfabeto :: String -> [Char]
lerAlfabeto [] = []
lerAlfabeto (x : xs )
	| pertence x espacoEmBranco = lerAlfabeto xs
	| otherwise = x:lerAlfabeto xs

pegaPalavras :: String -> [String]
pegaPalavras [] = []
pegaPalavras ( x : xs)
	| pertence x espacoEmBranco = pegaPalavras xs
	| otherwise = pegaPalavra (x : xs) : pegaPalavras (tiraPalavra (x:xs))

pegaPalavra :: String -> String
pegaPalavra [] = []
pegaPalavra (x : xs )
	| pertence x espacoEmBranco = []
	| otherwise = x:pegaPalavra xs

tiraPalavra :: String -> String
tiraPalavra [] = []
tiraPalavra (x : xs )
	| pertence x espacoEmBranco = (x : xs)
	| otherwise = tiraPalavra xs

tiraEspaco :: String -> String
tiraEspaco [] = []
tiraEspaco (x : xs)
	| pertence x espacoEmBranco = tiraEspaco xs
	| otherwise = (x : xs)

retirarBloco :: String -> Int -> String
retirarBloco [] _ = []
retirarBloco (x : xs) n
	| n == 0 = pegaBloco (x : xs)
	| otherwise = retirarBloco (tiraBloco (x:xs)) (n-1)

tiraBloco :: String -> String
tiraBloco [] = []
tiraBloco ( x : xs )
	| x == '\n' = xs
	| otherwise = tiraBloco ( tiraLinha xs )

pegaBloco :: String -> String
pegaBloco [] = []
pegaBloco ( x : xs )
	| x == '\n' = []
	| otherwise = (pegaLinha (x :xs)) ++"\n"++ (pegaBloco ( tiraLinha (x:xs) ))

tiraLinha :: String -> String
tiraLinha [] = []
tiraLinha (x : xs)
	| x == '\n' = xs
	| otherwise = tiraLinha xs

pegaLinha :: String -> String
pegaLinha [] = []
pegaLinha (x :xs)
	| x == '\n' = []
	| otherwise = x:pegaLinha xs

pertence :: Char -> [Char] -> Bool
pertence _ [ ] = False
pertence c (a:x)
	|c == a = True
	|otherwise = pertence c x

espacoEmBranco :: [Char]
espacoEmBranco = ['\n', '\t', ' ', '$', ',' , ';']
